<?php
//应用公共文件
use app\backend\model\AuthRule;
use \Firebase\JWT\JWT;
use Firebase\JWT\Key;

/**
 * 生成验签
 * @param $uid 用户id
 * @return mixed
 */
function signToken($uid){
    $key='test';         //自定义的一个随机字串用户于加密中常用的 验证  salt
    $token=array(
        "iss"=>$key,        //签发者 可以为空
        "aud"=>'',          //面象的用户，可以为空
        "iat"=>time(),      //签发时间
        "nbf"=>time()+2,    //在什么时候jwt开始生效
        "exp"=> time()+60,  //token 过期时间 time()+7200
        "data"=>[           //记录的uid的信息
            'uid'=>$uid,
        ]
    );
    $token = JWT::encode($token, $key, "HS256");  //生成了 token
    return $token;
}

/**
 * 验证token
 * @param $token
 * @return array|int[]
 */
function checkToken($token){
    $key='test';//自定义的一个随机字串用户于加密中常用的 验证  salt
    $res['code'] = 1;
    try {
        JWT::$leeway    = 60;//当前时间减去60，把时间留点余地
        $decoded        = JWT::decode($token, new Key($key, 'HS256')); //HS256方式，这里要和签发的时候对应
        $arr            = (array)$decoded;
        $res['code']  = 200;
        $res['data']    =(array)$arr['data'];
        return $res;
    } catch(\Firebase\JWT\SignatureInvalidException $e) {//签名不正确
        $res['msg']    = "签名不正确";
        return $res;
    } catch(\Firebase\JWT\BeforeValidException $e) {//签名在某个时间点之后才能用
        $res['msg']    = "token失效";
        return $res;
    } catch(\Firebase\JWT\ExpiredException $e) {//token过期
        $res['msg']    = "token失效";
        return $res;
    } catch(Exception $e) { //其他错误
        $res['msg']    = $e->getMessage();
        $res['msg']    = $e->getLine();
        return $res;
    }
}

//构造树形格式
function buildTree(array &$elements, $parentId = 0) {
    $branch = array();

    foreach ($elements as &$element) {
        if ($element['pid'] == $parentId) {
            $children = buildTree($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[$element['id']] = $element;
            unset($element);
        }
    }

    return $branch;
}